package rothag.views.gamestep.endofturn;

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;
import rothag.controller.MainController;
import rothag.enums.TypeDes;
import rothag.graphics.*;
import rothag.listener.DesListener;
import rothag.models.ressources.*;
import rothag.views.*;
import rothag.views.gamestep.GameStepJPanelBase;
import rothag.views.gamestep.diceshot.DeJLabel;

/**
 *
 * @author Gaetan
 */
public class FinTourJPanel extends GameStepJPanelBase implements ActionListener, DesListener {

    private JButtonBase etapeSuivante;
    private JScrollPane resumeScrollPane;
    private JLabel resumeLabel;
    private ArrayList<TypeDes> listeDes;
    private int nbDesLigne;
    private int nbDefausseNecessaire;
    private JLabel bois;
    private JLabel pierre;
    private JLabel tissu;
    private JLabel poterie;
    private JLabel ferDeLance;
    private int nbBois;
    private int nbPierre;
    private int nbTissu;
    private int nbPoterie;
    private int nbFerDeLance;
    private JButtonBase boisMoinsButton;
    private JButtonBase pierreMoinsButton;
    private JButtonBase tissuMoinsButton;
    private JButtonBase poterieMoinsButton;
    private JButtonBase ferDeLanceMoinsButton;
    private JButtonBase boisPlusButton;
    private JButtonBase pierrePlusButton;
    private JButtonBase tissuPlusButton;
    private JButtonBase poteriePlusButton;
    private JButtonBase ferDeLancePlusButton;
    private JLabel defausse;

    public FinTourJPanel(MainController controller) {
        super(controller);

        controller.addDesListener(this);

        nbDesLigne = 4;

        // Bouton étape suivante
        etapeSuivante = new JButtonBase("Etape suivante");
        etapeSuivante.setBounds(550, GraphicsParameters.smallFrameTopY + 60, 120, 40);
        etapeSuivante.addActionListener(this);
        add(etapeSuivante);

        Font font = GraphicsHelper.getFont(13, "bold");

        // Défausse
        JLabel labelDefausse = new JLabel("Défausse");
        labelDefausse.setFont(font);
        labelDefausse.setForeground(Color.white);
        labelDefausse.setHorizontalTextPosition(SwingConstants.CENTER);
        labelDefausse.setHorizontalAlignment(SwingConstants.CENTER);
        labelDefausse.setBounds(350, 50, largeur / 2, 25);
        add(labelDefausse);

        // Ajout des images des ressources
        int x = largeur / 2 + 70;
        int y = 90;
        int espace = 5;

        ImageIcon img = GraphicsHelper.getImageIcon(GraphicsParameters.pathImgBois, this);
        if (img.getIconHeight() == -1) {
            GraphicsHelper.afficherErreur("Erreur", "Erreur lors de l'ouverture du fichier image : " + GraphicsParameters.pathImgBois, this).setVisible(true);
            System.exit(1);
        }
        JLabel label = new JLabel(img);
        label.setBounds(x, y, img.getIconWidth(), img.getIconHeight());
        add(label);

        y += espace + img.getIconHeight();

        img = GraphicsHelper.getImageIcon(GraphicsParameters.pathImgPierre, this);
        if (img.getIconHeight() == -1) {
            GraphicsHelper.afficherErreur("Erreur", "Erreur lors de l'ouverture du fichier image : " + GraphicsParameters.pathImgPierre, this).setVisible(true);
            System.exit(1);
        }
        label = new JLabel(img);
        label.setBounds(x, y, img.getIconWidth(), img.getIconHeight());
        add(label);

        y += espace + img.getIconHeight();

        img = GraphicsHelper.getImageIcon(GraphicsParameters.pathImgPoterie, this);
        if (img.getIconHeight() == -1) {
            GraphicsHelper.afficherErreur("Erreur", "Erreur lors de l'ouverture du fichier image : " + GraphicsParameters.pathImgPoterie, this).setVisible(true);
            System.exit(1);
        }
        label = new JLabel(img);
        label.setBounds(x, y, img.getIconWidth(), img.getIconHeight());
        add(label);

        y += espace + img.getIconHeight();

        img = GraphicsHelper.getImageIcon(GraphicsParameters.pathImgTissu, this);
        if (img.getIconHeight() == -1) {
            GraphicsHelper.afficherErreur("Erreur", "Erreur lors de l'ouverture du fichier image : " + GraphicsParameters.pathImgTissu, this).setVisible(true);
            System.exit(1);
        }
        label = new JLabel(img);
        label.setBounds(x, y, img.getIconWidth(), img.getIconHeight());
        add(label);

        y += espace + img.getIconHeight();

        img = GraphicsHelper.getImageIcon(GraphicsParameters.pathImgFerDeLance, this);
        if (img.getIconHeight() == -1) {
            GraphicsHelper.afficherErreur("Erreur", "Erreur lors de l'ouverture du fichier image : " + GraphicsParameters.pathImgFerDeLance, this).setVisible(true);
            System.exit(1);
        }
        label = new JLabel(img);
        label.setBounds(x, y, img.getIconWidth(), img.getIconHeight());
        add(label);

        x += 25 + img.getIconWidth();
        y = 97;

        int hauteurLabel = img.getIconHeight();
        int largeurLabel = 50;

        boisMoinsButton = new JButtonBase("-");
        boisMoinsButton.setBounds(x, y, 25, 15);
        boisMoinsButton.addActionListener(this);
        add(boisMoinsButton);

        y += espace + hauteurLabel;

        pierreMoinsButton = new JButtonBase("-");
        pierreMoinsButton.setBounds(x, y, 25, 15);
        pierreMoinsButton.addActionListener(this);
        add(pierreMoinsButton);

        y += espace + hauteurLabel;

        poterieMoinsButton = new JButtonBase("-");
        poterieMoinsButton.setBounds(x, y, 25, 15);
        poterieMoinsButton.addActionListener(this);
        add(poterieMoinsButton);

        y += espace + hauteurLabel;

        tissuMoinsButton = new JButtonBase("-");
        tissuMoinsButton.setBounds(x, y, 25, 15);
        tissuMoinsButton.addActionListener(this);
        add(tissuMoinsButton);

        y += espace + hauteurLabel;

        ferDeLanceMoinsButton = new JButtonBase("-");
        ferDeLanceMoinsButton.setBounds(x, y, 25, 15);
        ferDeLanceMoinsButton.addActionListener(this);
        add(ferDeLanceMoinsButton);

        // ajout des labels des ressources
        x += 25;
        y = 90;

        bois = new JLabel("0");
        bois.setForeground(Color.white);
        bois.setHorizontalAlignment(SwingConstants.CENTER);
        bois.setBounds(x, y, largeurLabel, hauteurLabel);
        add(bois);

        y += espace + img.getIconHeight();

        pierre = new JLabel("0");
        pierre.setForeground(Color.white);
        pierre.setHorizontalAlignment(SwingConstants.CENTER);
        pierre.setBounds(x, y, largeurLabel, hauteurLabel);
        add(pierre);

        y += espace + hauteurLabel;

        poterie = new JLabel("0");
        poterie.setForeground(Color.white);
        poterie.setHorizontalAlignment(SwingConstants.CENTER);
        poterie.setBounds(x, y, largeurLabel, hauteurLabel);
        add(poterie);

        y += espace + hauteurLabel;

        tissu = new JLabel("0");
        tissu.setForeground(Color.white);
        tissu.setHorizontalAlignment(SwingConstants.CENTER);
        tissu.setBounds(x, y, largeurLabel, hauteurLabel);
        add(tissu);

        y += espace + hauteurLabel;

        ferDeLance = new JLabel("0");
        ferDeLance.setForeground(Color.white);
        ferDeLance.setHorizontalAlignment(SwingConstants.CENTER);
        ferDeLance.setBounds(x, y, largeurLabel, hauteurLabel);
        add(ferDeLance);

        x += largeurLabel;
        y = 97;

        boisPlusButton = new JButtonBase("+");
        boisPlusButton.setBounds(x, y, 25, 15);
        boisPlusButton.addActionListener(this);
        add(boisPlusButton);

        y += espace + hauteurLabel;

        pierrePlusButton = new JButtonBase("+");
        pierrePlusButton.setBounds(x, y, 25, 15);
        pierrePlusButton.addActionListener(this);
        add(pierrePlusButton);

        y += espace + hauteurLabel;

        poteriePlusButton = new JButtonBase("+");
        poteriePlusButton.setBounds(x, y, 25, 15);
        poteriePlusButton.addActionListener(this);
        add(poteriePlusButton);

        y += espace + hauteurLabel;

        tissuPlusButton = new JButtonBase("+");
        tissuPlusButton.setBounds(x, y, 25, 15);
        tissuPlusButton.addActionListener(this);
        add(tissuPlusButton);

        y += espace + hauteurLabel;

        ferDeLancePlusButton = new JButtonBase("+");
        ferDeLancePlusButton.setBounds(x, y, 25, 15);
        ferDeLancePlusButton.addActionListener(this);
        add(ferDeLancePlusButton);

        x = largeur / 2 + 70;
        y += espace + hauteurLabel;

        defausse = new JLabel("Défausse nécessaire");
        defausse.setFont(GraphicsHelper.getFont(13, null));
        defausse.setForeground(Color.white);
        defausse.setBounds(x, y, 200, hauteurLabel);
        add(defausse);

        // Résumé du tour
        label = new JLabel("Résumé du tour");
        label.setFont(font);
        label.setForeground(Color.white);
        label.setHorizontalTextPosition(SwingConstants.CENTER);
        label.setHorizontalAlignment(SwingConstants.CENTER);
        label.setBounds(0, 50, largeur / 2, 25);
        add(label);

        font = GraphicsHelper.getFont(13, null);

        label = new JLabel("Dés obtenus : ");
        label.setForeground(Color.white);
        label.setBounds(40, 75, largeur / 2 - 50, 25);
        add(label);

        resumeLabel = new JLabel();
        resumeLabel.setFont(font);
        resumeLabel.setOpaque(false);
        resumeLabel.setForeground(Color.white);
        resumeLabel.setVerticalAlignment(SwingConstants.TOP);

        resumeScrollPane = new JScrollPane(resumeLabel);
        resumeScrollPane.setBorder(null);
        resumeScrollPane.setOpaque(false);
        resumeScrollPane.getViewport().setOpaque(false);
        add(resumeScrollPane);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == etapeSuivante) {
            int defausseActuelle = nbBois + nbPierre + nbPoterie + nbTissu + nbFerDeLance;
            defausseActuelle -= Integer.parseInt(bois.getText());
            defausseActuelle -= Integer.parseInt(poterie.getText());
            defausseActuelle -= Integer.parseInt(pierre.getText());
            defausseActuelle -= Integer.parseInt(tissu.getText());
            defausseActuelle -= Integer.parseInt(ferDeLance.getText());

            if (defausseActuelle < nbDefausseNecessaire) {
                int delta = nbDefausseNecessaire - defausseActuelle;
                delta = delta < 0 ? 0 : delta;
                GraphicsHelper.afficherErreur("Défausse nécessaire", "Vous devez encore défausser " + delta + " ressource" + (delta > 1 ? "s" : ""), this).setVisible(true);
            } else {
                // Mise à jour des ressources
                controller.majRessourceJoueurCourant(Bois.class, Integer.parseInt(bois.getText()) - nbBois, false);
                controller.majRessourceJoueurCourant(Pierre.class, Integer.parseInt(pierre.getText()) - nbPierre, false);
                controller.majRessourceJoueurCourant(Poterie.class, Integer.parseInt(poterie.getText()) - nbPoterie, false);
                controller.majRessourceJoueurCourant(Tissu.class, Integer.parseInt(tissu.getText()) - nbTissu, false);
                controller.majRessourceJoueurCourant(FerDeLance.class, Integer.parseInt(ferDeLance.getText()) - nbFerDeLance, false);

                // Bouton étape suivante
                controller.etapeSuivante();
            }

        } else {
            if (e.getSource() == boisMoinsButton) {
                int val = Integer.parseInt(bois.getText());
                val--;
                if (val == 0) {
                    boisMoinsButton.setEnabled(false);
                }
                if (val != nbBois) {
                    boisPlusButton.setEnabled(true);
                }
                bois.setText(String.valueOf(val));
            } else if (e.getSource() == boisPlusButton) {
                int val = Integer.parseInt(bois.getText());
                val++;
                if (val == nbBois) {
                    boisPlusButton.setEnabled(false);
                }
                if (val != 0) {
                    boisMoinsButton.setEnabled(true);
                }
                bois.setText(String.valueOf(val));
            } else if (e.getSource() == pierreMoinsButton) {
                int val = Integer.parseInt(pierre.getText());
                val--;
                if (val == 0) {
                    pierreMoinsButton.setEnabled(false);
                }
                if (val != nbPierre) {
                    pierrePlusButton.setEnabled(true);
                }
                pierre.setText(String.valueOf(val));
            } else if (e.getSource() == pierrePlusButton) {
                int val = Integer.parseInt(pierre.getText());
                val++;
                if (val == nbPierre) {
                    pierrePlusButton.setEnabled(false);
                }
                if (val != 0) {
                    pierreMoinsButton.setEnabled(true);
                }
                pierre.setText(String.valueOf(val));
            } else if (e.getSource() == poterieMoinsButton) {
                int val = Integer.parseInt(poterie.getText());
                val--;
                if (val == 0) {
                    poterieMoinsButton.setEnabled(false);
                }
                if (val != nbPoterie) {
                    poteriePlusButton.setEnabled(true);
                }
                poterie.setText(String.valueOf(val));
            } else if (e.getSource() == poteriePlusButton) {
                int val = Integer.parseInt(poterie.getText());
                val++;
                if (val == nbPoterie) {
                    poteriePlusButton.setEnabled(false);
                }
                if (val != 0) {
                    poterieMoinsButton.setEnabled(true);
                }
                poterie.setText(String.valueOf(val));
            } else if (e.getSource() == tissuMoinsButton) {
                int val = Integer.parseInt(tissu.getText());
                val--;
                if (val == 0) {
                    tissuMoinsButton.setEnabled(false);
                }
                if (val != nbTissu) {
                    tissuPlusButton.setEnabled(true);
                }
                tissu.setText(String.valueOf(val));
            } else if (e.getSource() == tissuPlusButton) {
                int val = Integer.parseInt(tissu.getText());
                val++;
                if (val == nbTissu) {
                    tissuPlusButton.setEnabled(false);
                }
                if (val != 0) {
                    tissuMoinsButton.setEnabled(true);
                }
                tissu.setText(String.valueOf(val));
            } else if (e.getSource() == ferDeLanceMoinsButton) {
                int val = Integer.parseInt(ferDeLance.getText());
                val--;
                if (val == 0) {
                    ferDeLanceMoinsButton.setEnabled(false);
                }
                if (val != nbFerDeLance) {
                    ferDeLancePlusButton.setEnabled(true);
                }
                ferDeLance.setText(String.valueOf(val));
            } else if (e.getSource() == ferDeLancePlusButton) {
                int val = Integer.parseInt(ferDeLance.getText());
                val++;
                if (val == nbFerDeLance) {
                    ferDeLancePlusButton.setEnabled(false);
                }
                if (val != 0) {
                    ferDeLanceMoinsButton.setEnabled(true);
                }
                ferDeLance.setText(String.valueOf(val));
            }

            majLabelDefausse();
        }

    }

    public void reset() {
        int x = 60;
        int y = 100;
        int i = 0;

        remove(resumeScrollPane);

        // Suppression des dés
        for (Component c : getComponents()) {
            if (c instanceof DeJLabel) {
                remove(c);
            }
        }

        // Ajout des dés
        if (listeDes != null) {
            DeJLabel label = null;

            for (TypeDes de : listeDes) {
                label = new DeJLabel(de);
                label.setBounds(x, y, label.getImage().getIconWidth(), label.getImage().getIconHeight());
                add(label);

                i++;

                if (i % nbDesLigne == 0) {
                    y += label.getBounds().getHeight() + 5;
                    x = 60;
                } else {
                    x += label.getBounds().getWidth() + 5;
                }
            }

            // Calcul du début du scroll pane
            int top = 100 + ((i - 1) / nbDesLigne + 1) * (label.getImage().getIconHeight() + 5);
            resumeScrollPane.setBounds(40, top, largeur / 2 - 50, GraphicsParameters.bigFrameBottomY - top - 5);
        } else {
            resumeScrollPane.setBounds(40, 100, largeur / 2 - 50, GraphicsParameters.bigFrameBottomY - 105);
        }

        StringBuilder text = new StringBuilder();
        text.append("<html>");
        for (String str : controller.getListeActionsJoueurCourant()) {
            text.append(str);
            text.append("<br>");
        }
        text.append("</html>");

        resumeLabel.setText(text.toString());

        add(resumeScrollPane);

        HashMap<Class, Integer> listeNombreRessource = controller.getNombreRessourceJoueurCourant();
        nbBois = listeNombreRessource.get(Bois.class);
        nbPierre = listeNombreRessource.get(Pierre.class);
        nbPoterie = listeNombreRessource.get(Poterie.class);
        nbTissu = listeNombreRessource.get(Tissu.class);
        nbFerDeLance = listeNombreRessource.get(FerDeLance.class);

        nbDefausseNecessaire = controller.defausse();
        bois.setText(String.valueOf(nbBois));
        boisMoinsButton.setEnabled(nbBois != 0 && nbDefausseNecessaire > 0);
        boisPlusButton.setEnabled(false);

        pierre.setText(String.valueOf(nbPierre));
        pierreMoinsButton.setEnabled(nbPierre != 0 && nbDefausseNecessaire > 0);
        pierrePlusButton.setEnabled(false);

        poterie.setText(String.valueOf(nbPoterie));
        poterieMoinsButton.setEnabled(nbPoterie != 0 && nbDefausseNecessaire > 0);
        poteriePlusButton.setEnabled(false);

        tissu.setText(String.valueOf(nbTissu));
        tissuMoinsButton.setEnabled(nbTissu != 0 && nbDefausseNecessaire > 0);
        tissuPlusButton.setEnabled(false);

        ferDeLance.setText(String.valueOf(nbFerDeLance));
        ferDeLanceMoinsButton.setEnabled(nbFerDeLance != 0 && nbDefausseNecessaire > 0);
        ferDeLancePlusButton.setEnabled(false);

        defausse.setText(nbDefausseNecessaire + " ressource" + (nbDefausseNecessaire > 1 ? "s" : "") + " à défausser");
    }

    public void desGardesChanged(ArrayList<TypeDes> listeDes) {
        this.listeDes = listeDes;
    }

    private void majLabelDefausse() {
        int defausseActuelle = nbBois + nbPierre + nbPoterie + nbTissu + nbFerDeLance;
        defausseActuelle -= Integer.parseInt(bois.getText());
        defausseActuelle -= Integer.parseInt(poterie.getText());
        defausseActuelle -= Integer.parseInt(pierre.getText());
        defausseActuelle -= Integer.parseInt(tissu.getText());
        defausseActuelle -= Integer.parseInt(ferDeLance.getText());

        int delta = nbDefausseNecessaire - defausseActuelle;
        delta = delta < 0 ? 0 : delta;

        defausse.setText(delta + " ressource" + (delta > 1 ? "s" : "") + " à défausser");
    }
}
